package ar.unsam.tp.test

import ar.unsam.tp.excepciones.JugadorNoJuegaException
import ar.unsam.tp.programa.Administrador
import ar.unsam.tp.programa.Calificacion
import ar.unsam.tp.programa.Equipo
import ar.unsam.tp.programa.Jugador
import ar.unsam.tp.programa.Partido
import ar.unsam.tp.solicitudes.SolicitudCalificacion
import ar.unsam.tp.tipo.Estandar
import ar.unsam.tp.tipo.Solidario
import junit.framework.Assert
import org.junit.Before
import org.junit.Test

class TestCalificar {
	var Partido partido = new Partido()
	var Equipo equipoTest

	var Jugador osvaldo = new Jugador("osvaldo")
	var Jugador tito = new Jugador("tito")
	var Jugador carlos = new Jugador("carlos")
	var Jugador juan = new Jugador("juan")
	var Jugador pepe = new Jugador("pepe")

	var Administrador admin = new Administrador()
	var Calificacion calificacionParaOsvaldo
	var SolicitudCalificacion solicCalif = new SolicitudCalificacion(calificacionParaOsvaldo)

	@Before
	def void init() {
		calificacionParaOsvaldo = pepe.crearCalificacion(osvaldo, 0, "osvaldo gallina pechofrio")
		admin = new Administrador()

		pepe.setTipoDeInscripcion(new Estandar())
		osvaldo.setTipoDeInscripcion(new Estandar())
		tito.setTipoDeInscripcion(new Solidario())
		carlos.setTipoDeInscripcion(new Estandar())
		juan.setTipoDeInscripcion(new Estandar())

		partido.alta(pepe)
		partido.alta(osvaldo)
		partido.alta(tito)
		partido.alta(carlos)
		partido.alta(juan)

		equipoTest = new Equipo(partido.jugadoresQueJueganSeguro)

		equipoTest.alta(pepe)
		equipoTest.alta(osvaldo)
		equipoTest.alta(tito)
		equipoTest.alta(carlos)
		equipoTest.alta(juan)
	}

	@Test(expected=typeof(JugadorNoJuegaException))
	def void testCalificarJugadorNoAnotado() {
		equipoTest.formacionFinal.remove(osvaldo)
		
		solicCalif = new SolicitudCalificacion(calificacionParaOsvaldo, equipoTest)
		admin.agregarSolicitud(solicCalif)
		admin.aceptarSolicitud(solicCalif)
		
		Assert::assertTrue(osvaldo.contieneCalificacionRecibida(calificacionParaOsvaldo))
	}

	@Test
	def void testAceptarCalificacion() {
		equipoTest.confirmaEquipo(pepe)
		equipoTest.confirmaEquipo(osvaldo)
		equipoTest.confirmaEquipo(tito)
		equipoTest.confirmaEquipo(carlos)
		equipoTest.confirmaEquipo(juan)

		solicCalif = new SolicitudCalificacion(calificacionParaOsvaldo, equipoTest)
		admin.agregarSolicitud(solicCalif)
		admin.aceptarSolicitud(solicCalif)
		
		Assert::assertTrue(osvaldo.contieneCalificacionRecibida(calificacionParaOsvaldo))
	}

	@Test
	def void testRechazarCalificacion() {
		equipoTest.confirmaEquipo(pepe)
		equipoTest.confirmaEquipo(osvaldo)
		equipoTest.confirmaEquipo(tito)
		equipoTest.confirmaEquipo(carlos)
		equipoTest.confirmaEquipo(juan)

		solicCalif = new SolicitudCalificacion(calificacionParaOsvaldo, equipoTest)
		admin.agregarSolicitud(solicCalif)
		admin.rechazarSolicitud(solicCalif, "lenguaje inapropiado")
		
		Assert::assertTrue(pepe.contieneCalificacionRechazada(calificacionParaOsvaldo))
	}
}
